/*
 * Klasse enthält alle relevanten DB-Operationen für Einträge als statische Methoden
 * 
 */

package com.mysql;

import com.objects.entry;
import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author admin
 */
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

public class mysqlEntries {

    //statische Methode, die ein entry-Objekt zurückgibt, welches anhand der übermittelten ID aus der Datenbank gelesen wird
    public static entry getEntryByID (int entryid) throws Exception
    {
        //Verbindung zur Datenbank über mysqlConnector-Klasse
        mysqlConnector con = new mysqlConnector();
        try
        {
            //leeres entry-Objekt erzeugen (ist später Rückgabeparameter)
            entry ret_Entry=new entry();
            //neues SQL-Statement mit der Verbindung zur DB erzeugen
            Statement state = con.verbMySQL.createStatement();
            //Abfrage der Datenbank über SQL-Statement
            ResultSet result = state.executeQuery("SELECT * FROM TBLEntries WHERE EntryID='"+entryid+"'");
            //wenn Ergebnis eine Zeile hat
            if (result.next())
            {
                //überschreibe leeres Objekt mit neuem Objekt, dem die Daten aus der DB zugewiesen werden
                ret_Entry = new entry(result.getInt(1),result.getString(2),result.getInt(3),result.getString(4),result.getDate(5),result.getString(6));
            }
            //gebe das entry-Objekt zurück
            return ret_Entry;

        }
        //Fehler auffangen und ausgeben
        catch (SQLException ex)
        {
             Logger.getLogger(mysqlFeeds.class.getName()).log(Level.SEVERE,null,ex);

        }
        finally
        {
            //Verbindung immer schließen
            con.verbMySQL.close();
        }
        //Rückgabewert bei Fehlern
        return null;
    }

    //statische Methode, die alle Artikel eines Feeds, der durch die übermittelten feedid identifiziert wird, zurückgibt
    public static ArrayList<entry> getEntriesOfFeed (int feedid) throws Exception
    {
         //Verbindung zur Datenbank über mysqlConnector-Klasse
        mysqlConnector con = new mysqlConnector();
        try
        {
            //leere ArrayList mit entry-Objekten erzeugen (ist Rückgabeparameter
            ArrayList<entry> retArr=new ArrayList();
             //neues SQL-Statement mit der Verbindung zur DB erzeugen
            Statement state = con.verbMySQL.createStatement();
            //Abfrage der Datenbank über SQL-Statement
            ResultSet result = state.executeQuery("SELECT * FROM TBLEntries WHERE FeedID='"+feedid+"'");
            //solange ein weiterer Datensatz besteht
            while (result.next())
            {
                //füge der ArrayList ein neues entry-Objekt mit den Daten aus der DB hinzu
                retArr.add(new entry(result.getInt(1),result.getString(2),result.getInt(3),result.getString(4),result.getDate(5),result.getString(6)));

            }
            //gebe die ArrayList zurück
            return retArr;

        }
        //Fehler auffangen und zurückgeben
        catch (SQLException ex)
        {
             Logger.getLogger(mysqlFeeds.class.getName()).log(Level.SEVERE,null,ex);

        }
        finally
        {
            //Verbindung immer schließen
            con.verbMySQL.close();
        }
        //Rückgabewert bei Fehlern
        return null;
    }

    //statische Methode, die prüft, ob ein Artikel eines bestimmten Users bereits favorisiert ist
    public static Boolean checkIfEntryIsFavorite(int userid,int entryid) throws Exception
    {
        //Verbindung zur Datenbank über mysqlConnector-Klasse
        mysqlConnector con = new mysqlConnector();
        try
        {

             //neues SQL-Statement mit der Verbindung zur DB erzeugen
            Statement state = con.verbMySQL.createStatement();
             //Abfrage der Datenbank über SQL-Statement
            ResultSet result = state.executeQuery("SELECT * FROM TBLFav WHERE EntryID='"+entryid+"' AND UserID='"+userid+"'");
            //wenn ein Datensatz betroffen
            if (result.next())
            {
                //gebe wahr zurück
                return true;
            }
            //sonst
            else
            {
                //gebe falsch zurück
                return false;
            }
        }
        //Fehler auffangen und ausgeben
        catch (SQLException ex)
        {
             Logger.getLogger(mysqlFeeds.class.getName()).log(Level.SEVERE,null,ex);

        }
        finally
        {
            //Verbindung immer schließen
            con.verbMySQL.close();
        }
        return false;
    }

    //statische Methode, die alle favorisierten Artikel eines Users (anhand userid) zurückgibt
    public static ArrayList<entry> getFavoriteEntries (int userid) throws Exception
    {
        //Verbindung zur Datenbank über mysqlConnector-Klasse
        mysqlConnector con = new mysqlConnector();
        try
        {
            //leere ArrayList mit entry-Objekten erzeugen (ist Rückgabeparameter)
            ArrayList<entry> retArr=new ArrayList();
            //neues SQL-Statement mit der Verbindung zur DB erzeugen
            Statement state = con.verbMySQL.createStatement();
             //Abfrage der Datenbank über SQL-Statement
            ResultSet result = state.executeQuery("SELECT TBLEntries.* FROM TBLEntries,TBLFav WHERE TBLFav.UserID='"+userid+"' AND TBLEntries.EntryID=TBLFav.EntryID ORDER BY TBLEntries.EntryDate DESC");
            //solange ein weiterer Datensatz vorhanden ist
            while (result.next())
            {
                //füge eines neues entry-Objekt mit Daten aus der DB zur ArrayList hinzu
                retArr.add(new entry(result.getInt(1),result.getString(2),result.getInt(3),result.getString(4),result.getDate(5),result.getString(6)));

            }
            //gebe die ArrayList von entry-Objekten zurück
            return retArr;

        }
        //Fehler auffangen und ausgeben
        catch (SQLException ex)
        {
             Logger.getLogger(mysqlFeeds.class.getName()).log(Level.SEVERE,null,ex);

        }
        finally
        {
            //Verbindung immer schließen
            con.verbMySQL.close();
        }
        //Rückgabewert bei Fehlern
        return null;
    }

    
    public static ArrayList<entry> getEntriesByFeednameAndUser (int userid,String feedname) throws Exception
    {
        mysqlConnector con = new mysqlConnector();
        try
        {
            ArrayList<entry> retArr=new ArrayList();
            Statement state = con.verbMySQL.createStatement();
            ResultSet result = state.executeQuery("SELECT TBLEntries.* FROM TBLEntries,TBLSubscription WHERE TBLSubscription.IndividualName='"+feedname+"' AND TBLSubscription.UserID='"+userid+"' AND TBLEntries.FeedID=TBLSubscription.FeedID ORDER BY TBLEntries.EntryDate DESC");
            while (result.next())
            {
                retArr.add(new entry(result.getInt(1),result.getString(2),result.getInt(3),result.getString(4),result.getDate(5),result.getString(6)));

            }
            return retArr;

        }
        catch (SQLException ex)
        {
             Logger.getLogger(mysqlFeeds.class.getName()).log(Level.SEVERE,null,ex);

        }
        finally
        {
            con.verbMySQL.close();
        }
        return null;
    }

     public static Boolean checkIfFeedExists (String feedurl) throws Exception
    {
        mysqlConnector con = new mysqlConnector();
        try
        {

            Statement state = con.verbMySQL.createStatement();
            ResultSet result = state.executeQuery("SELECT * FROM TBLEntries WHERE EntryURL='"+feedurl+"'");
            if (result.next())
            {
                return true;
            }
            return false;

        }
        catch (SQLException ex)
        {
             Logger.getLogger(mysqlFeeds.class.getName()).log(Level.SEVERE,null,ex);

        }
        finally
        {
            con.verbMySQL.close();
        }
        return false;
    }

    public static Boolean saveEntry (entry saveEntry,int feedid) throws Exception
    {
        mysqlConnector con = new mysqlConnector();
        try
        {
            DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
            String contents=saveEntry.getEntrycontents();
            contents=contents.replaceAll("'", "");
            contents=contents.replaceAll("\"","");
            String title=saveEntry.getEntryname();
            title=title.replaceAll("'", "");

            title=title.replaceAll("\"","");
            String sql="INSERT INTO TBLEntries (EntryName,FeedID,EntryContents,EntryDate,EntryURL) VALUES ('"+title+"','"+feedid+"','"+contents+"','"+dateFormat.format(saveEntry.getEntrydate())+"','"+saveEntry.getEntryURL()+"')";

            
            
            Statement state = con.verbMySQL.createStatement();
            if (state.executeUpdate(sql)>0)
            {
                return true;
            }
            else
            {
                return false;
            }

        }
        catch (SQLException ex)
        {
             Logger.getLogger(mysqlFeeds.class.getName()).log(Level.SEVERE,null,ex);

        }
        finally
        {
            con.verbMySQL.close();
        }
        return false;
    }

    public static Boolean favoriteEntry (int entryid, int userid, Boolean unfav) throws Exception
   {
        mysqlConnector con = new mysqlConnector();
        try
        {
            String sql="";
            if (unfav)
            {
                sql="DELETE FROM TBLFav WHERE EntryID='"+entryid+"' AND UserID='"+userid+"'";
            }
            else
            {
                sql="INSERT INTO TBLFav (EntryID,UserID) VALUES ('"+entryid+"','"+userid+"')";
            }

            Statement state = con.verbMySQL.createStatement();
            if (state.executeUpdate(sql)>0)
            {
                return true;
            }
            else
            {
                return false;
            }

        }
        catch (SQLException ex)
        {
             Logger.getLogger(mysqlFeeds.class.getName()).log(Level.SEVERE,null,ex);

        }
        finally
        {
            con.verbMySQL.close();
        }
        return false;
   }

   


   
}
